home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / python-rdflib / rdflib / store / Redland.py < prev    next >
Encoding:
Python Source  |  2007-04-04  |  3.4 KB  |  110 lines

  1.  
  2. import rdflib
  3. from rdflib.Graph import Graph
  4. from rdflib.URIRef import URIRef
  5. from rdflib.Node import Node
  6. from rdflib.BNode import BNode
  7. from rdflib.Literal import Literal
  8. import RDF
  9.  
  10. from rdflib.store import Store
  11.  
  12. def _t(i):
  13.     if isinstance(i, rdflib.URIRef):
  14.         return RDF.Node(RDF.Uri(unicode(i)))
  15.     if isinstance(i, rdflib.BNode):
  16.         return RDF.Node(blank=str(i))
  17.     if isinstance(i, rdflib.Literal):
  18.         return RDF.Node(literal=str(i))
  19.     if isinstance(i, Graph):
  20.         return _t(i.identifier)
  21.     if i is None:
  22.         return None
  23.     raise TypeError, 'Cannot convert %s' % `i`
  24.  
  25. def _c(i):
  26.     return _t(i)
  27.  
  28.  
  29. def _f(i):
  30.     if isinstance(i, RDF.Uri):
  31.         return rdflib.URIRef(i)
  32.     if isinstance(i, RDF.Node):
  33.         if i.is_blank():
  34.             return rdflib.BNode(i.blank_identifier)
  35.         elif i.is_literal():
  36.             return rdflib.Literal(i)
  37.         else:
  38.             return URIRef(i.uri)
  39.     if i is None:
  40.         return None
  41.     raise TypeError, 'Cannot convert %s' % `i`
  42.  
  43.  
  44. class Redland(Store):
  45.     context_aware = True
  46.     def __init__(self, model=None):
  47.         super(Redland, self).__init__()
  48.         if model is None:
  49.             model = RDF.Model(RDF.MemoryStorage(options_string="contexts='yes'"))
  50.         self.model = model
  51.  
  52.     def __len__(self, context=None):
  53.         """ Return number of triples (statements in librdf). """
  54.  
  55.         count = 0
  56.         for triple, cg in self.triples((None, None, None), context):
  57.             count += 1
  58.         return count
  59.  
  60.     def add(self, (subject, predicate, object), context=None, quoted=False):
  61.         """\
  62.         Add a triple to the store of triples.
  63.         """
  64.         if context is not None:
  65.             self.model.append(RDF.Statement(_t(subject), _t(predicate), _t(object)), _c(context))
  66.         else:
  67.             self.model.append(RDF.Statement(_t(subject), _t(predicate), _t(object)))
  68.  
  69.     def remove(self, (subject, predicate, object), context, quoted=False):
  70.         if context is None:
  71.             contexts = self.contexts()
  72.         else:
  73.             contexts = [context]
  74.         for context in contexts:
  75.             if subject is None and predicate is None and object is None:
  76.                 self.model.remove_statements_with_context(_c(context))
  77.             else:
  78.                 del self.model[RDF.Statement(_t(subject), _t(predicate), _t(object)), _c(context)]
  79.  
  80.     def triples(self, (subject, predicate, object), context=None):
  81.         """A generator over all the triples matching """
  82.         cgraph = RDF.Model()
  83.         triple = RDF.Statement(_t(subject), _t(predicate), _t(object))
  84.         for statement, c in self.model.find_statements_context(triple):
  85.             if context is None or _f(c) == context.identifier:
  86.                 cgraph.append(statement)
  87.         for statement in cgraph.find_statements(triple):
  88.             ret = []
  89.             for c in self.model.get_contexts():
  90.                 if self.model.contains_statement_context(statement, _c(context)):
  91.                     ret.append(c)
  92.             yield (_f(statement.subject), _f(statement.predicate), _f(statement.object)), iter(ret)
  93.  
  94.     def contexts(self, triple=None): # TODO: have Graph support triple?
  95.         for context in self.model.get_contexts():
  96.             yield Graph(self, _f(context))
  97.  
  98.     def bind(self, prefix, namespace):
  99.         pass
  100.  
  101.     def namespace(self, prefix):
  102.         pass
  103.  
  104.     def prefix(self, namespace):
  105.         pass
  106.  
  107.     def namespaces(self):
  108.         pass
  109.  
  110.